﻿using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ControlPresupuesto
{
    /// <summary>
    /// Esta clase tiene la responsabilidad de manejar el estilo y los mensajes de las excepciones que 
    /// puedan generarse durante la ejecucion de la aplicación.
    /// </summary>
    public class MessageException
    {

        private static FrmShowMessageException frmMsn = null;
        private static FrmShowMessageException getFrmShowMessageException()
        {
            if (MessageException.frmMsn == null)
            {
                MessageException.frmMsn = new FrmShowMessageException();
            }
            //MessageException.frmMsn = new FrmShowMessageException();
            return MessageException.frmMsn;
        }


        /// <summary>
        /// Mostrar el mensaje de la excepcion captuarada de una forma agradable al usuario.
        /// </summary>
        /// <param name="ex">Excepcion</param>
        public static void show(Exception ex)
        {
            if (ex.Message.Length == 0)
                return;

            string msn = string.Empty;
            string aux = string.Empty;
            int mayusculas = 0, minusculas = 0;

            //if ("System.ArgumentOutOfRangeException".Equals(ex.GetType().ToString()))
            //{
            //    msn += "No valida la fecha corectamente.";
            //}
            //else 
            if ("System.InvalidOperationException".Equals(ex.GetType().ToString()))
            {
                //msn += "La operación que intenta realizar no es valida.";
                msn += "La operación no pudo realizarse con exito, intentelo de nuevo.";
            }
            else if ("System.Data.NoNullAllowedException".Equals(ex.GetType().ToString()))
            {
                string campo = ex.Message;
                campo = campo.Substring(0, campo.LastIndexOf("'"));
                if (campo.Contains("'id_"))
                {
                    campo = campo.Replace("'id_", "'");
                }
                campo = campo.Substring(campo.LastIndexOf("'") + 1);
                campo = campo.Replace("_", " ");

                //-------en esta parte le doy formato al nombre del campo en base a las mayusculas

                //--- Verifico si tiene mayusculas y minusculas.
                for (int i = 0; i < campo.Length; i++)
                {
                    minusculas += (char.IsLower(campo[i]) ? 1 : 0);
                    mayusculas += (char.IsUpper(campo[i]) ? 1 : 0);
                    //-- con que haya almenos una mayuscula y una minuscula basta y sobra
                    if (minusculas > 0 && mayusculas > 0)
                    {
                        break;
                    }
                }

                //--- si tiene mayusculas y minusculas, el nombre del campo se separa por las mayusculas
                if (mayusculas > 0 && minusculas > 0)
                {
                    for (int i = 0; i < campo.Length; i++)
                    {
                            aux += (char.IsUpper(campo[i]) ? " " + campo[i].ToString() : campo[i].ToString());
                    }
                    campo = aux.Replace("  "," ").Trim();                    
                }

                campo = campo.ToUpper();
                msn += "Debe indicar todos los campos obligatorios (*).\n\nCampo: {0}.".Replace("{0}", campo);
            }
            else if ("System.Data.SqlClient.SqlException".Equals(ex.GetType().ToString()))
            {
                msn += ex.Message;
                if (msn.Contains("Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT"))
                {
                    msn = msn.Substring(0, msn.IndexOf("Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT"));
                }
                if (msn.Contains("El recuento de transacciones después de EXECUTE indica un número no coincidente de instrucciones BEGIN y COMMIT"))
                {
                    msn = msn.Substring(0, msn.IndexOf("El recuento de transacciones después de EXECUTE indica un número no coincidente de instrucciones BEGIN y COMMIT"));
                }

            }
            else if ("System.Data.ConstraintException".Equals(ex.GetType().ToString()))
            {
                if (ex.Message.Contains("Ya está presente el valor") || ex.Message.Contains("the value is already"))
                {
                    msn += "El valor que desea ingresar ya se encuentra registrado en el sistema.";
                }
                else
                {
                    msn = ex.Message;
                }
            }
            else if ("System.Data.InvalidConstraintException".Equals(ex.GetType().ToString()))
            {
                msn += "No ha sido posible realizar la operación en estos momentos, cambie los valores e inténtelo mas tarde.";
            }
            else if ("System.Data.Odbc.OdbcException".Equals(ex.GetType().ToString()))
            {
                msn += "No ha sido posible establecer la conexión con el servidor. \nVerifique la conexion  e intente mas tarde.";
            }
            else if ("System.ArgumentException".Equals(ex.GetType().ToString()))
            {
                if (ex.Message.Contains("'"))
                {
                    string campo = ex.Message;

                    campo = campo.Substring(0, campo.LastIndexOf("'"));
                    if (campo.Contains("'id_"))
                    {
                        campo = campo.Replace("'id_", "'");
                    }
                    campo = campo.Substring(campo.LastIndexOf("'") + 1);
                    campo = campo.Replace("_", " ");
                    campo = campo.ToUpper();
                    msn += "El campo {0} ha excedido la longitud máxima permitida, reduzca la longitud del texto e inténtelo de nuevo.".Replace("{0}", campo);
                }
                else
                {
                    msn += "No ha sido posible realizar la operacion, Se presento un error en la aplicación.";
                }
            }
            else if ("System.IO.FileNotFoundException".Equals(ex.GetType().ToString()))
            {
                msn += "NO se encontro el archivo indicado, verifique la existencia del archivo e intentelo de nuevo.";
            }
            else if ("System.IO.IOException".Equals(ex.GetType().ToString()))
            {
                msn += "La operacion no pudo realizarse.\nEl archivo esta abierto ó el disco de destino es de solo lectura.";
            }
            else if ("System.Runtime.InteropServices.COMException".Equals(ex.GetType().ToString()))
            {
                msn += "La operacion no pudo realizarse.\nEl archivo esta abierto ó el disco de destino es de solo lectura.";
            }
            else if ("System.ComponentModel.Win32Exception".Equals(ex.GetType().ToString()))
            {
                msn += "No hay ninguna aplicacion asociada a este tipo de archivo.";
            }
            else if ("System.UnauthorizedAccessException".Equals(ex.GetType().ToString()))
            {
                msn += "Actualmente usted no tiene acceso a los documentos de soporte.\n\nDebe ponerse en contacto con el administrador del sistema para que solucione este inconveniente.";
            }
            else if ("System.FormatException".Equals(ex.GetType().ToString()))
            {
                msn += "El valor ingresado no tiene el formato correcto.";
            }
            else if ("System.ArgumentOutOfRangeException".Equals(ex.GetType().ToString()))
            {
                //-- esta excepcion (en la mayoria de los casos) no es culpa del usuario, por eso no muestro ningun mensaje.
                return;
            }

            //--- si se presenta una nueva excepcion se la muestro al usuario y le pido que se la notifique al administrador del sistema.
            else
            {
                msn += "NO ha sido posible realizar la operación exitosamente.\nCopie esta pantalla (botón Imprimir pantalla) y notifique al Administrador del sistema, Gracias.\n\nExcepción: \n" + ex.GetType().ToString() + "\n\nMensaje:\n" + ex.Message+"\n";
            }

            
            MessageException.getFrmShowMessageException().Mensaje = msn;
            MessageException.getFrmShowMessageException().ShowDialog();
            MessageException.frmMsn = null;

            //--- Si el error Inicia con el codigo "99999", entonces debo hacer que el usuario inicie sesion nuevamente
            if (msn.Length > 5)
            {
                if (msn.Substring(0, 5).Equals("99999"))
                {
                    if (!((INDEX)ManageForms.getFormulario("INDEX", false)).iniciarSesion())
                    {
                        ManageForms.closeAllForms();
                        return;
                    }
                    
                    //--- Cargo de nuevo el menu del sistema (si digito un usuario con un rol Distinto)
                    Cursor.Current = Cursors.WaitCursor;
                    ((INDEX)ManageForms.getFormulario("INDEX", false)).cargarMenu();
                    Cursor.Current = Cursors.Default;

                    System.Windows.Forms.MessageBox.Show("Realice de nuevo la operacion, por favor.",string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            //System.Windows.Forms.MessageBox.Show(msn, "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //System.Windows.Forms.MessageBox.Show(msn+"\n\nMensaje:\n"+ex.Message,"",MessageBoxButtons.OK,MessageBoxIcon.Warning);
        }
    }
}
